﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// @brief 菜单状态类，处理菜单显示、隐藏及按钮点击事件。
/// 继承自FSMState，用于实现有限状态机中的菜单状态。
/// </summary>
public class MenuState : FSMState
{
    /**
     * @brief Awake方法，在对象加载时被调用。
     * 
     * 设置状态ID为菜单状态，并添加状态转换规则。
     */
    private void Awake()
    {
        stateID = StateID.Menu; ///< 设置当前状态为菜单状态。
        AddTransition(Transition.StartButtonClick, StateID.Play); ///< 添加状态转换规则：点击开始按钮时，转到游戏状态。
    }

    /**
     * @brief DoBeforeEntering方法，在进入状态前执行。
     * 
     * 显示菜单界面，并将相机缩放到初始位置。
     */
    public override void DoBeforeEntering()
    {
        ctrl.view.ShowMenu(); ///< 显示菜单界面。
        ctrl.cameraManager.ZoomOut(); ///< 将相机缩放到初始位置。
    }

    /**
     * @brief DoBeforeLeaving方法，在离开状态前执行。
     * 
     * 隐藏菜单界面。
     */
    public override void DoBeforeLeaving()
    {
        ctrl.view.HideMenu(); ///< 隐藏菜单界面。
    }

    /**
     * @brief OnStartButtonClick方法，处理开始按钮点击事件。
     * 
     * 播放点击音效，并执行状态转换到游戏状态。
     */
    public void OnStartButtonClick()
    {
        ctrl.audioManager.PlayCursor(); ///< 播放点击音效。
        fsm.PerformTransition(Transition.StartButtonClick); ///< 执行状态转换。
    }

    /**
     * @brief OnRankButtonClick方法，处理排行榜按钮点击事件。
     * 
     * 显示排行榜界面，并显示当前得分、最高得分和游戏次数。
     */
    public void OnRankButtonClick()
    {
        ctrl.view.ShowRankUI(ctrl.model.Score, ctrl.model.HighScore, ctrl.model.NumbersGame); ///< 显示排行榜界面及数据。
    }

    /**
     * @brief OnDestroyButtonClick方法，处理重置数据按钮点击事件。
     * 
     * 清除游戏数据，并显示排行榜界面。
     */
    public void OnDestroyButtonClick()
    {
        ctrl.model.ClearData(); ///< 清除游戏数据。
        OnRankButtonClick(); ///< 显示排行榜界面。
    }

    /**
     * @brief OnRestartButtonClick方法，处理重新开始按钮点击事件。
     * 
     * 重启游戏数据，清除当前形状，并执行状态转换到游戏状态。
     */
    public void OnRestartButtonClick()
    {
        ctrl.model.Restart(); ///< 重启游戏数据。
        ctrl.gameManager.ClearShape(); ///< 清除当前形状。
        fsm.PerformTransition(Transition.StartButtonClick); ///< 执行状态转换。
    }
}